#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<string>
#include<vector>

// 通过条件变量控制线程的执行【调用接口】

// 静态分配锁，和静态分配条件变量
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 

int tickets = 1000;
void* start_routine(void* args)
{
    std::string name = static_cast<const char*>(args);

    while(true)
    {
        pthread_mutex_lock(&lock); // 加锁
        // 这里应该有个判断条件是否满足
        pthread_cond_wait(&cond, &lock); // 不满足条件就要等待。
        std::cout << name << " -> " << tickets << std::endl;
        tickets--;
        pthread_mutex_unlock(&lock); // 解锁
    }

    return nullptr;
}

int main()
{
    // 创建5个线程
    std::vector<pthread_t> tds(5);
    for(int i = 0; i < 5; i++)
    {
        // char buffer[32]; // 这里不能是这个，不然会导致当线程开始执行的时候，拿到的buffer都是thread_5
        char* buffer = new char[32]; 
        snprintf(buffer, 32, "thread_%d", i+1); // 不能是sizeof buffer，因为buffer现在是一个指针
        pthread_create(&tds[i], nullptr, start_routine, (void*)buffer);
    }

    // 主线程负责将等待中的线程唤醒
    while(true)
    {
        sleep(1);
        // pthread_cond_signal(&cond); // 唤醒等待的线程，只唤醒一个
        pthread_cond_broadcast(&cond); // 将等待的线程全部唤醒
        std::cout << "main thread wakeup one thread" << std::endl;
    }

    // 线程等待
    for(auto& td : tds)
    {
        pthread_join(td, nullptr);
    }

    return 0;
}